﻿using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using ExceptionReporting;
using SmartHealthCare.Properties;
using SmartHealthCareDbLayer;

namespace SmartHealthCare.Frm
{
    public partial class FrmConsultaMedicaEstado : Form
    {
        public FrmConsultaMedicaEstado()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
        }

        private int _row;
        private TiposCliente _current;

        private void TapClientesPorTipoEnter(object sender, EventArgs e)
        {
            //Para Optener todos los clientes del mismo tipo
            //primero optengo el tipo de la propiedad tag del _lvlIdValue
            //luego hago el querry para todos los clientes
            //y ese listado lo asigno al grid del tap 
            var tipo = _lvlIdValue.Tag as TiposCliente;
            if (tipo == null) return;

            _dgData.DataSource = (from c in tipo.Clientes
                                  select new
                                             {
                                                 c.CodigoCliente,
                                                 c.Nombre,
                                                 c.Identificacion,
                                                 c.CodigoSeguro,
                                                 c.NSS

                                             }).AsParallel().ToList();
        }

        private void FrmTiposDeCliente_Load(object sender, EventArgs e)
        {
            //Carga los datos desde la base de datos.
            Cargar();
        }

        public void Cargar()
        {
            Console.WriteLine(ModelSingle.Instance.TiposCliente.Count());

            if (_row < 0 || _row >= ModelSingle.Instance.TiposCliente.AsParallel().Count())
            {
                MessageBox.Show(Resources.FrmTiposDeCliente_Cargar_No_ahy_mas_Registros, Application.ProductName, MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                return;
            }
            try
            {
                _current = ModelSingle.Instance.TiposCliente.AsParallel()
                    .OrderBy(t => t.IdTipoCliente)
                    .Skip(_row)
                    .Take(1)
                    .First();
                //   _row++;
                UpDateLabel();
                Mostrar(_current);
            }
            catch (Exception ex)
            {
                var reporter = new ExceptionReporter();
                reporter.ReadConfig();
                reporter.Show(ex);
            }
        }

        private void UpDateLabel()
        {
            _lvlTotalRegistros.Text = string.Format("{0} de {1}", _row + 1,// row + 1 por que se empiesa a contar en 0 , so 1 = 0 ..
                                                    ModelSingle.Instance.TiposCliente.AsParallel().Count());
            Invalidate();
        }

        private void Mostrar(TiposCliente current)
        {
            _current = current;
            //
            _lvlIdValue.Text = current.IdTipoCliente.ToString("0000");
            _lvlIdValue.Tag = current;
            _txtDescripcion.Text = current.Descripcion.Trim();
        }

        private void ToolStripButton4Click(object sender, EventArgs e)
        {
            _row = ModelSingle.Instance.TiposCliente.AsParallel().Count() - 1;//busco el total de registros y le resto uno como el 1000 seria 999
            Cargar();// y vuelvo a cargar
        }

        private void ToolStripButton3Click(object sender, EventArgs e)
        {
            _row = _row + 1;//me muevo asi ariba sumando uno 
            Cargar();// y vuelvo a cargar 
        }

        private void ToolStripButton2Click(object sender, EventArgs e)
        {
            _row = _row - 1;// me muevo asi atras restando uno
            Cargar();// y vuelvo a cargar
        }

        private void ToolStripButton1Click(object sender, EventArgs e)
        {
            _row = 0;// voi al inicio como el primer elemento es 0...
            Cargar();// y vuelvo a cargar
        }

        /// <summary>
        /// News the tool strip button click.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        private void NewToolStripButtonClick(object sender, EventArgs e)
        {
            try
            {
                //desbloque la edicion de los controles;
                //y limpio los controles
                Utils.Util.ReadOnly(this, false);
                Utils.Util.Limpiar(this);
                Utils.Util.YellowColor(this);//coloreo los textboxes de amarillo
                //pongo el foco en el textbox de la descripcion
                _txtDescripcion.Text = string.Empty;
                _txtDescripcion.Focus();
            }
            catch (Exception ex)
            {
                var reporter = new ExceptionReporter();
                reporter.ReadConfig();
                reporter.Show(ex);
            }
        }

        private void OpenToolStripButtonClick(object sender, EventArgs e)
        {
            try
            {
                var obje = Utils.Util.DeSerialise();

                if (obje.GetType() != typeof(TiposCliente)) return;

                if (!ModelSingle.Instance.TiposCliente.Contains((TiposCliente)obje))
                    ModelSingle.Instance.AddToTiposCliente((TiposCliente)obje);

                ModelSingle.Instance.SaveChanges();
                //
                MessageBox.Show(Resources.FrmTiposDeCliente_OpenToolStripButtonClick_Importado_con_Exito_, Application.ProductName, MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                var reporter = new ExceptionReporter();
                reporter.ReadConfig();
                reporter.Show(ex);
            }
        }

        private void SaveToolStripButtonClick(object sender, EventArgs e)
        {
            try
            {
                //busco el ultimo id en la tabla
                var id = ModelSingle.Instance.TiposCliente.Max(c => (int?)c.IdTipoCliente);
                //pregunto si ahi un registro actual para modificarlo , sino lo creo con el nuevo id.
                //si ahi un ultimmo le sumo uno, si no, la tabla esta vacia y ahi k empesar en 1.
                var tipocliente = _current ?? TiposCliente.CreateTiposCliente(id.HasValue ? id.Value + 1 : 1);
                tipocliente.Descripcion = _txtDescripcion.Text; // la descripcion del registro.
                //
                switch (tipocliente.EntityState)
                {
                    case EntityState.Added://si el registro es nuevo;
                    case EntityState.Detached:
                        ModelSingle.Instance.AddToTiposCliente(tipocliente); //agrego a la coleccion
                        ModelSingle.Instance.SaveChanges(); //guardo los cambios.
                        break;
                    case EntityState.Modified:
                        ModelSingle.Instance.SaveChanges(); //como es una modificacion, guardo los cambios.
                        break;
                    default:
                        ModelSingle.Instance.SaveChanges(); //como creo que es una modificacion , guardo los cambios.
                        break;
                }
                //
                MessageBox.Show(@"Guardado con Exito.", @"Smart Health Care", MessageBoxButtons.OK,
                              MessageBoxIcon.Information);
                //
                Utils.Util.BlueColor(this);//to.do de azul ahora.
                Utils.Util.ReadOnly(this, true);// y que no se pueda escribir mas.
                UpDateLabel(); //actualizo el UI.

            }
            catch (Exception ex)
            {
                var reporter = new ExceptionReporter();
                reporter.ReadConfig();
                reporter.Show(ex);
            }

        }

        private void ToolStripButton5Click(object sender, EventArgs e)
        {
            if (_current == null) return; // solo edito si ahi un registro activo.
            //
            //desbloque la edicion de los controles;
            //y limpio los controles
            Utils.Util.ReadOnly(this, false);
            Utils.Util.Limpiar(this);
            Utils.Util.YellowColor(this);//coloreo los textboxes de amarillo
            //pongo el foco en el textbox de la descripcion
            _txtDescripcion.Focus();
        }
    }
}
